package com.tenbit.zip.ctl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import javax.servlet.http.HttpServletRequest;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import com.tenbit.com.vo.ErrorMsgVO;
import com.tenbit.zip.svc.ZIP1000SVCImpl;
import com.tenbit.zip.vo.CodeBookVO;

/**
 * 코드집을 관리하기 위한 CTL<br>
 * <PRE>
 * SystemName: 텐비트 4주차 workshop
 * BusinessName: 코드집(ZIP)
 * Author: 강현구
 * Class Name(en): ZIP1000CTL.java
 * Class Name(kor): 코드집 관리 CTL
 * Descripttion: 코드집을 관리하기 위한 CTL
 * Modification history
 * 수정일      		수정자     		수정내용
 * -------  	---------	------------
 * 2014.04.28	강현구	      최초 생성   
 * </PRE>
 *
 */
@Controller
public class ZIP1000CTL {
	
	@Autowired
	ZIP1000SVCImpl zip1000svcImpl;
	
	private Logger log = Logger.getLogger(this.getClass());
	
	/**
	* Map<String, String[]>를 Map<String, Object>형태로 변환해준다.
	* @param paraMap - Map<String, String[]>타입의 폼필드값
	* @return  폼필드값을 Map<String, Object>으로 바꿔준다.
	*/
	public Map<String, Object> parsingParaMap(Map<String, String[]> paraMap){
        Iterator<Entry<String, String[]>> it=paraMap.entrySet().iterator();
        Map<String, Object> map = new HashMap<String, Object>();
        
         while(it.hasNext()){
             Entry<String, String[]> entry = it.next();
             
              if(entry.getValue(). length > 1){	    //tag의 name값이 여러 개 인 경우
                  List<String> list= new ArrayList<String>();
                  
                   for (String str : entry.getValue()) {
                        list.add(str);
                  }
                  
                  map.put(entry.getKey(), list);
             } else{								//tag의 name값이 하나 인경우
                  map.put(entry.getKey(), entry.getValue()[0]);
                  
             }               
        }
        
         return map;
  }

	/**
	* 분류코드와 분류코드명을 가져오는 함수
	* @param paraMap - 검색 조건 값
	* @return  겁색 조건 값에 따라 분류코드와 분류코드명을 map타입으로 보내준다.
	*/
	@RequestMapping("/getCodeBookTypeList.do")
	@ResponseBody
	public Map<String, Object> getCodeBookTypeList(HttpServletRequest request){
		
		log.debug("=======start: "+this.getClass().getName()+"."+new Exception().getStackTrace()[0].getMethodName()
				+"=======");
		
		Map<String, Object> map = new HashMap<String, Object>();
		
		map.put("page", "1");
		map.put("total", "3");
		map.put("records", "30");
		
		Map<String, Object> paraMap = parsingParaMap(request.getParameterMap());
		
		log.debug("paraMap "+paraMap);
		List<CodeBookVO> rowsMap = zip1000svcImpl.listCodeBookType(paraMap);
		
		map.put("rows",rowsMap );
		
		log.debug("=======end: "+this.getClass().getName()+"."+new Exception().getStackTrace()[0].getMethodName()
				+"=======");
		
		return map;
		
	}
	
	/**
	* 상세코드에 대한 정보를 가져오는 함수
	* @param paraMap - 분류코드
	* @return  분류코드에 따라서 상세코드에 대한 정보를 map타입으로 리턴
	*/
	@RequestMapping("/getCodeBookDetailList.do")
	@ResponseBody
	public Map<String, Object> getCodeBookDetailList(HttpServletRequest request){
		
		log.debug("=======start: "+this.getClass().getName()+"."+new Exception().getStackTrace()[0].getMethodName()
				+"=======");
		
		Map<String, Object> map = new HashMap<String, Object>();
		
		map.put("page", "1");
		map.put("total", "3");
		map.put("records", "30");
		
		Map<String, Object> paraMap = parsingParaMap(request.getParameterMap());
		
		if( paraMap.size() == 0 ){
			String codeType =
					zip1000svcImpl.listCodeBookType(new HashMap<String, Object>()).get(0).getCodeType();
			
			paraMap.put("codeType", codeType);
		}
		
		List<CodeBookVO> rowsMap = zip1000svcImpl.listCodeBookDetail(paraMap);
		
		map.put("rows",rowsMap );
		
		log.debug("=======end: "+this.getClass().getName()+"."+new Exception().getStackTrace()[0].getMethodName()
				+"=======");
		
		return map;
		
	}
	
	/**
	* 최초 실행시 호출되는 함수
	* @return  처음 실행되는 화면
	*/
	@RequestMapping("/doZipMainView.do")
	public ModelAndView doZipMainView(){
		
		log.debug("=======start: "+this.getClass().getName()+"."+new Exception().getStackTrace()[0].getMethodName()
				+"=======");
		
		ModelAndView mv = new ModelAndView();
		
		mv.setViewName("ZIP1000M0");
		
		log.debug("=======end: "+this.getClass().getName()+"."+new Exception().getStackTrace()[0].getMethodName()
				+"=======");
		
		return mv;
	}
	
	/**
	* 분류코드를 저장했을 때 호출되는 함수
	* @param 분류코드에 대한 리스트
	* @return  에러메시지
	*/
	@RequestMapping("/exeSaveType.do")
	@ResponseBody
	public Map<String, Object> exeSaveType(@RequestBody List<Map<String, Object>> dataSet){
		
		log.debug("=======start: "+this.getClass().getName()+"."+new Exception().getStackTrace()[0].getMethodName()
				+"=======");
		
		ErrorMsgVO errMsg = zip1000svcImpl.doValidateType(dataSet);
		Map<String, Object> map = new HashMap<String, Object>();
		
		if( errMsg.isErrExist() ){
			map.put("errMsg", errMsg.getErrMsg());
			
			return map;
		}
		
		errMsg = zip1000svcImpl.exeCodeBook(dataSet);
		
		if(errMsg.isErrExist()){
			map.put("errMsg", errMsg.getErrMsg());
			
			return map;
		}
		
		log.debug("=======end: "+this.getClass().getName()+"."+new Exception().getStackTrace()[0].getMethodName()
				+"=======");
		
		return null;
	}
	
	/**
	* 상세코드를 저장했을 때 호출되는 함수
	* @param 상세코드에 대한 리스트
	* @return  에러메시지
	*/
	@RequestMapping("/exeSaveDetail.do")
	@ResponseBody
	public Map<String, Object> exeSaveDetail(@RequestBody List<Map<String, Object>> dataSet){
		
		log.debug("=======start: "+this.getClass().getName()+"."+new Exception().getStackTrace()[0].getMethodName()
				+"=======");
		
		log.debug(dataSet);
		
		ErrorMsgVO errMsg = zip1000svcImpl.doValidateDetail(dataSet);
		Map<String, Object> map = new HashMap<String, Object>();
		
		if( errMsg.isErrExist() ){
			map.put("errMsg", errMsg.getErrMsg());
			
			return map;
		}
		
		errMsg = zip1000svcImpl.exeCodeBook(dataSet);
		
		if( errMsg.isErrExist() ){
			map.put("errMsg", errMsg.getErrMsg());
			
			return map;
		}
		
		log.debug("=======end: "+this.getClass().getName()+"."+new Exception().getStackTrace()[0].getMethodName()
				+"=======");
		
		return map;
	}
	
}
